package imai78gae.heya.service;

import java.util.List;

import imai78gae.heya.model.Group;
import imai78gae.heya.model.Message;
import imai78gae.heya.model.UserInfo;

/**
 * グループとそれに従属するメッセージに対する操作を提供するサービスクラスです。
 * 
 * @author imai78
 *
 */
public interface GroupService {

	/**
	 * 新しいグループを作成します。
	 * 
	 * @param groupId 新しいグループのグループID
	 * @param groupName 新しいグループのグループ名
	 * @param groupDescription 新しいグループの説明
	 * @param inviteKey 新しいグループの招待者への認証キー
	 * @param groupOwnerId グループオーナーのログインID
	 * @param groupOwnerName グループオーナー名
	 */
	void createNewGroup(String groupId, String groupName,
			String groupDescription, String inviteKey,
			String groupOwnerId, String groupOwnerName);

	/**
	 * 指定したグループIDを持つグループを返します。
	 * 
	 * @param groupId グループID
	 * @return {@link Group}
	 */
	Group getGroup(String groupId);

	/**
	 * 指定したグループIDのメッセージ一覧を返します。
	 * 
	 * @param groupId グループID
	 * @return {@link Message}の一覧
	 */
	List<Message> getGroupMessages(String groupId);

	/**
	 * 指定した人をグループに招待します。
	 * 
	 * @param groupId グループID
	 * @param userName 招待したい人の呼び名
	 * @param mailAddress 招待したい人のメールアドレス
	 */
	void inviteUser(String groupId, String userName, String mailAddress);

	/**
	 * グループIDで指定したグループに、新たにユーザを追加します。
	 * 
	 * @param groupId グループID
	 * @param userInfo 追加したいユーザの{@link UserInfo}
	 */
	void joinUser(String groupId, UserInfo userInfo);

	/**
	 * 指定されたグループIDのグループに、新しいメッセージを追記します。
	 * 
	 * @param groupId グループID
	 * @param message 追記したい{@link Message}
	 */
	void addMessage(String groupId, Message message);

	/**
	 * 指定されたグループIDのグループに従属する指定したメッセージを削除します。
	 * 
	 * @param groupId グループID
	 * @param messageId 削除したいメッセージID
	 */
	void removeMessage(String groupId, String messageId);

	/**
	 * 指定したグループIDのグループに所属する全てのメッセージを削除します。
	 * <p>
	 * 緊急時用です。
	 * </p>
	 * 
	 * @param groupId グループID
	 */
	void removeEmergency(String groupId);

}
